﻿Type.registerNamespace("MoniMisi2");

MoniMisi2.Funciones = function() {
    MoniMisi2.Funciones.initializeBase(this);
}

MoniMisi2.Funciones.prototype = {

    initialize: function() {
        MoniMisi2.Funciones.callBaseMethod(this, 'initialize');
    },

    dispose: function() {
        MoniMisi2.Funciones.callBaseMethod(this, 'dispose');
    },
    PosicionCursor: function(pTexto) {

        if (document.selection) {
            var rango = document.selection.createRange().duplicate()
            rango.moveEnd('character', pTexto.value.length)
            if (rango.text == '') return pTexto.value.length
            return pTexto.value.lastIndexOf(rango.text)
        } else {
            return pTexto.selectionStart
        }


    },
    Seleccion: function Seleccion(pTexto) {
        if (document.selection) {
            var rango = document.selection.createRange().duplicate();
            var LargoSeleccion = rango.text.length;
            rango.moveEnd('character', pTexto.value.length);

            if (pTexto.value.lastIndexOf(rango.text) == 0) {
                return { Inicio: 1, Largo: LargoSeleccion }
            } else {
                return { Inicio: pTexto.value.lastIndexOf(rango.text), Largo: LargoSeleccion };
            }

        } else {
            if (pTexto.selectionStart == 0) {
                return { Inicio: 1, Largo: pTexto.selectionEnd - pTexto.selectionStart };
            } else {
                return { Inicio: pTexto.selectionStart, Largo: pTexto.selectionEnd - pTexto.selectionStart };
            }

        }
    },
    PosicionarCursor: function(pTexto, pPos) {

        if (document.selection) {
            if (document.createRange) {     // all browsers, except IE before version 9
                var rangeObj = document.createRange();
                rangeObj.selectNodeContents(pTexto);
                rangeObj.select();
            } else {
                var rango = pTexto.createTextRange();
                if (pPos == null) {
                    rango.moveStart('character', 0);
                    rango.moveEnd('character', pTexto.value.length);
                } else { rango.move('character', pPos) };
                rango.select();
            }
        } else {
            pTexto.focus();
            pTexto.setSelectionRange(pPos, pPos);
        }
    },

    Navegador: function() {
        var EsFireFox = false;
        var EsExplorer = false;
        var EsOpera = false;
        var EsChrome = false;
        var Version = null;

        if (/Chrome[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
            EsChrome = true;
            Version = new Number(RegExp.$1)
        }

        if (/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
            EsFireFox = true;
            Version = new Number(RegExp.$1)
        };

        if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
            EsExplorer = true;
            Version = new Number(RegExp.$1)
        }

        if (/Opera[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
            EsOpera = true;
            Version = new Number(RegExp.$1)
        }

        return { EsFireFox: EsFireFox, EsExplorer: EsExplorer, EsOpera: EsOpera, EsChrome: EsChrome, Version: Version }

    },

    InvocarWebMethod: function(pWebMethod, pContrato, pRetorno, pErroneo, pSincronico, pPath) {
        var xmlHTTP = new XMLHttpRequest();
        xmlHTTP.onreadystatechange = function() {
            if (xmlHTTP.readyState == 4) {
                if (xmlHTTP.status == 200) {
                    if (pRetorno) {
                        var data = Sys.Serialization.JavaScriptSerializer.deserialize(xmlHTTP.responseText)
                        if (data.d) {
                            pRetorno(data.d);
                        } else {
                            var pData = {};
                            pData.Indice = [];
                            pData.Indice[0] = [];
                            pData.Orden = 0;
                            pData.Metodo = {};
                            pData.Metodo.Nombre = "Arribar";
                            pData.Metodo.Parametros = { Orden: 0, Pagina: 0 };
                            pData.Pagina = data;
                            pRetorno(pData);
                        }
                    }
                } else {
                    if (pErroneo) pErroneo(Sys.Serialization.JavaScriptSerializer.deserialize(xmlHTTP.responseText));
                }
            }
        }
        if (pPath == undefined || pPath == "" || pPath == null) {
            pPath = document.location.pathname;
        }
        if (pWebMethod.indexOf("http") != -1) {
            xmlHTTP.open("POST", pWebMethod, pSincronico)
        } else {
            xmlHTTP.open("POST", pPath + "/" + pWebMethod, pSincronico)
        }

        //        xmlHTTP.open("POST", pPath + "/" + pWebMethod, pSincronico)

        xmlHTTP.setRequestHeader("Content-Type", "application/json; charset=utf-8")
        var ParamLlamada = Sys.Serialization.JavaScriptSerializer.serialize(pContrato);
        xmlHTTP.send(ParamLlamada);
    },

    Transfer: function(pUri, pOperation, pData, pOK, pError, pSinc) {
        var xmlHTTP = new XMLHttpRequest();
        xmlHTTP.onreadystatechange = function() {
            if (xmlHTTP.readyState == 4) {
                if (xmlHTTP.getResponseHeader("Content-type") != "text/html; charset=utf-8") {
                    if (xmlHTTP.status < 400 || xmlHTTP.status == 1223) {
                        var Arg = xmlHTTP.responseText == "" ? "" : JSON.parse(xmlHTTP.responseText);
                        if (pOK) pOK(Arg);
                    } else {
                        if (pError) pError(JSON.parse(xmlHTTP.responseText));
                    }
                } else {
                    window.top.document.documentElement.innerHTML = xmlHTTP.responseText
                }
            }
        }
        xmlHTTP.open(pOperation, pUri, pSinc)
        xmlHTTP.setRequestHeader("Content-Type", "application/json; charset=utf-8")
        if (typeof (window.top.__UsuarioOriginal) != "undefined") {
            xmlHTTP.setRequestHeader("UsuarioOriginal", window.top.__UsuarioOriginal)
        }
        xmlHTTP.send(JSON.stringify(pData));
    },


    ObtenerScrollDocumento: function() {
        var ScrollTop = document.body.scrollTop;
        if (ScrollTop == 0) {
            if (window.pageYOffset)
            { ScrollTop = window.pageYOffset; }
            else
            { ScrollTop = (document.body.parentElement) ? document.body.parentElement.scrollTop : 0; }
        }
        var ScrollLeft = document.body.scrollLeft;
        if (ScrollLeft == 0) {
            if (window.pageXOffset)
            { ScrollLeft = window.pageXOffset; }
            else
            { ScrollLeft = (document.body.parentElement) ? document.body.parentElement.scrollLeft : 0; }
        }
        return { x: ScrollLeft, y: ScrollTop }
    },

    PadL: function(val, ch, num) {
        var pad = "";
        if (!ch) ch = " ";
        do {
            pad += ch;
        } while (pad.length < num);
        return (pad + val).substr((pad + val).length - num);
    },
    PadR: function(val, ch, num) {
        var pad = "";
        if (!ch) ch = " ";
        do {
            pad += ch;
        } while (pad.length < num);
        return (val + pad).substr(0, num);
    },

    CoordenadasMouseEnControl: function(pEvento, pControl) {
        var NuevaPosX = pEvento.clientX
        var NuevaPosY = pEvento.clientY
        var PosicionControl = this.ObtenerPosicionAbsoluta(pControl, false);
        NuevaPosX = NuevaPosX - PosicionControl.x;
        NuevaPosY = NuevaPosY - PosicionControl.y;

        return { x: NuevaPosX, y: NuevaPosY };
    },

    Anclar: function(pObjetivo, pObjetivoCardinal, pElemento, pElementoCardinal, pAjustando) {
        if (pAjustando == undefined || pAjustando == null) { pAjustando = false }
        pElemento.style.position = "absolute"
        pElemento.style.top = "0px"
        pElemento.style.left = "0px"
        var PosicionAbsolutaObjetivo = this.ObtenerPosicionAbsoluta(pObjetivo);
        var PosicionRelativaElemento = this.ObtenerPosicionRelativa(pElemento);
        var PuntoCardinalObjetivo = this.ObtenerPuntoCardinal(pObjetivo, pObjetivoCardinal);
        var PuntoCardinalElemento = this.ObtenerPuntoCardinal(pElemento, pElementoCardinal);
        pElemento.style.top = PosicionAbsolutaObjetivo.y + PuntoCardinalObjetivo.y - PosicionRelativaElemento.y - PuntoCardinalElemento.y + "px"
        pElemento.style.left = PosicionAbsolutaObjetivo.x + PuntoCardinalObjetivo.x - PosicionRelativaElemento.x - PuntoCardinalElemento.x + "px"
        if (pAjustando) {
            var Ubicacion = this.Encaja(pElemento)
            if (!Ubicacion.Entra) {
                if (Ubicacion.Derecha > 0) {
                    pElemento.style.left = (pElemento.offsetLeft - Ubicacion.Derecha) + "px"
                }
                if (Ubicacion.Abajo > 0) {
                    pElemento.style.top = (pElemento.offsetTop - Ubicacion.Abajo) + "px"
                }
            }
        }
    },
    Encaja: function(pElemento) {

        var Escroll = this.ObtenerScrollDocumento();
        var Izquierda = pElemento.offsetLeft - Escroll.x;
        var Derecha = pElemento.offsetWidth + pElemento.offsetLeft - Escroll.x - document.documentElement.clientWidth;
        var Arriba = pElemento.offsetTop - Escroll.y;
        var Abajo = pElemento.offsetHeight + pElemento.offsetTop - Escroll.y - document.documentElement.clientHeight;

        var Entra = (Izquierda >= 0) && (Derecha <= 0) && (Arriba >= 0) && (Abajo <= 0);

        return { Entra: Entra, Derecha: Derecha, Izquierda: Izquierda, Arriba: Arriba, Abajo: Abajo };
    },



    ObtenerPuntoCardinal: function(pElemento, pCardinal) {

        var Punto = { x: 0, y: 0 };
        var MargenBottom = 0
        var MargenRight = 0

        if (document.defaultView) {
            var DisplayAnterior = pElemento.style.display;
            if (this.Navegador().EsFireFox) {
                pElemento.style.display = "inline-block";   //Para que ande getComputedStyle en FF
            }

            MargenBottom = parseInt(document.defaultView.getComputedStyle(pElemento, null).marginBottom)
            MargenRight = parseInt(document.defaultView.getComputedStyle(pElemento, null).marginRight)
            pElemento.style.display = DisplayAnterior
        } else {
            MargenBottom = parseInt(pElemento.currentStyle.marginBottom)
            MargenRight = parseInt(pElemento.currentStyle.marginRight)
        }

        if (isNaN(MargenBottom)) { MargenBottom = 0 }
        if (isNaN(MargenRight)) { MargenRight = 0 }

        switch (pCardinal) {
            case "Centro":
                Punto.x = Math.round(pElemento.offsetWidth / 2);
                Punto.y = Math.round(pElemento.offsetHeight / 2);
                break
            case "N":
                Punto.x = Math.round(pElemento.offsetWidth / 2);
                break;
            case "S":
                Punto.x = Math.round(pElemento.offsetWidth / 2);
                Punto.y = pElemento.offsetHeight + MargenBottom;
                break;
            case "E":
                Punto.x = pElemento.offsetWidth + MargenRight;
                Punto.y = Math.round(pElemento.offsetHeight / 2);
                break;
            case "O":
                Punto.y = Math.round(pElemento.offsetHeight / 2);
                break;
            case "NO":
                break;
            case "NE":
                Punto.x = pElemento.offsetWidth + MargenRight;
                break;
            case "SO":
                Punto.y = pElemento.offsetHeight + MargenBottom;
                break;
            case "SE":
                Punto.y = pElemento.offsetHeight + MargenBottom;
                Punto.x = pElemento.offsetWidth + MargenRight;
                break;
        }

        return { x: Punto.x, y: Punto.y };
    },

    ObtenerPosicionAbsoluta: function(pElemento, pConScroll) {
        if (pConScroll == undefined) { pConScroll = true }
        var NuevaPosX = pElemento.offsetLeft
        var NuevaPosY = pElemento.offsetTop
        var Elemento = pElemento.offsetParent

        while (Elemento) {

            NuevaPosX = NuevaPosX + Elemento.offsetLeft - (pConScroll ? Elemento.scrollLeft : 0)
            NuevaPosY = NuevaPosY + Elemento.offsetTop - (pConScroll ? Elemento.scrollTop : 0)
            if (Elemento.parentNode != Elemento.offsetParent) {
                if (Elemento.parentNode.documentElement) {
                } else {
                    NuevaPosX = NuevaPosX - (pConScroll ? Elemento.parentNode.scrollLeft : 0)
                    NuevaPosY = NuevaPosY - (pConScroll ? Elemento.parentNode.scrollTop : 0)
                }
            }
            Elemento = Elemento.offsetParent;

        }

        var ScrollDoc = this.ObtenerScrollDocumento()
        return { x: NuevaPosX + (pConScroll ? ScrollDoc.x : -ScrollDoc.x), y: NuevaPosY + (pConScroll ? ScrollDoc.y : -ScrollDoc.y) }
    },

    ObtenerPosicionRelativa: function(pElemento) {

        var NuevaPosX = 0;
        var NuevaPosY = 0;
        var Elemento = pElemento.offsetParent
        var HayUnAbsoluto = false;
        while (Elemento) {
            if (Elemento.style.position == "absolute") {
                HayUnAbsoluto = true;
            }
            if (HayUnAbsoluto) {
                NuevaPosX = NuevaPosX + Elemento.offsetLeft
                NuevaPosY = NuevaPosY + Elemento.offsetTop
            }
            Elemento = Elemento.offsetParent;
        };

        return { x: NuevaPosX, y: NuevaPosY }
    },

    insertAfter: function(newElement, targetElement) {
        var parent = targetElement.parentNode;
        if (parent.lastchild == targetElement) {

            parent.appendChild(newElement);
        } else {

            parent.insertBefore(newElement, targetElement.nextSibling);
        }
    },
    ValidarControlArgs: function(pValor) { this.Valor = pValor; this.Mensaje = ""; this.Mensajes = new Array(); this.Erroneo = false; },

    InitValidarControl: function(pControl) {

        if (pControl["CssError"] == undefined) { throw "El control debe tener la propiedad 'CssError' para implemetar la Validacion" }
        if (pControl["_element"] == undefined) { throw "El control debe tener la propiedad '_element' para implemetar la Validacion" } else {
            if (pControl["_element"].tagName != 'INPUT' && pControl["_element"].tagName != "SELECT") { throw "El control debe ser un INPUT o SELECT para implemetar la Validacion" }
        }
        if (typeof pControl["add_Validando"] != 'function') { throw "El control debe tener el método 'add_Validando' para implemetar la Validacion" }
        pControl.ImplementaValidar = true;
        pControl.MensajeError = "";
        pControl.Mensajes = new Array();
        pControl.EsValido = false;
        pControl.CssCorrecto = "";
        pControl.spanError = "";
        pControl.Titulo = "";
        pControl.CssCorrecto = pControl.get_element().className
        pControl.Titulo = pControl._element.title;
        pControl.spanError = document.createElement("span")
        pControl.spanError.appendChild(document.createElement("ul"));
        pControl.spanError.style.display = "none";
        this.insertAfter(pControl.spanError, pControl._element);
    },

    ValidarControl: function(pControl, pValor) {
        if (pControl["ImplementaValidar"] == undefined) { throw "no se ha corrido el método 'InitValidarControl' para la implemantar la Validación" };
        var Error = false;
        if (pControl.EsValido) { pControl.Titulo = pControl._element.title };

        var DisAnterior = pControl.spanError.style.display
        var Lista = pControl.spanError.children[0];
        while (Lista.firstChild) {
            Lista.removeChild(Lista.firstChild)
        };
        this.HacerValido(pControl);
        var h = pControl.get_events().getHandler('Validando');
        if (h) {
            var pe = new this.ValidarControlArgs(pValor);
            h(pControl, pe)
            if (pe.Erroneo) {
                if (pe.Mensaje != "") {
                    pControl.Mensajes.push(pe.Mensaje);
                }
                for (var n = 0; n < pe.Mensajes.length; n += 1) {
                    pControl.Mensajes.push(pe.Mensajes[n]);

                }
                Error = true;
            }
        }

        if (Error) {
            pControl._element.className = pControl.CssError
            pControl._element.title = pControl.MensajeError;
            for (var n = 0; n < pControl.Mensajes.length; n += 1) {
                Lista.appendChild(document.createElement("li"));
                Lista.children[n].innerHTML = pControl.Mensajes[n]
            }
            pControl.EsValido = false;
            pControl.spanError.style.display = ""
        } else {
            pControl._element.title = pControl.Titulo
        }

    },

    HacerValido: function(pControl) {
        if (pControl["ImplementaValidar"] != undefined) {
            pControl.Mensajes = new Array();
            pControl.MensajeError = ""
            pControl._element.title = ""
            pControl._element.className = pControl.CssCorrecto
            pControl.EsValido = true;
            pControl.spanError.style.display = "none";
        }
    },
    InvalidarControl: function(pControl, pMensaje) {
        var Lista = pControl.spanError.children[0];
        pControl._element.className = pControl.CssError
        pControl._element.title = pControl.MensajeError;
        var UltimoMensaje = Lista.appendChild(document.createElement("li"));
        UltimoMensaje.innerHTML = pMensaje
        pControl.EsValido = false;
        pControl.spanError.style.display = ""
    },
    LlamadaNivel: function(pFuncion) {
        var niv = 0
        while (pFuncion.caller != null) {
            pFuncion = pFuncion.caller
            niv += 1;
        }
        return niv
    },
    Clonar: function(Origen, EnBlanco) {
        var Blanquear = EnBlanco ? EnBlanco : false;
        if (Origen != null && Origen != undefined) {
            if (typeof (Origen) == "boolean") {
                return (Blanquear ? false : Origen);
            }
            if (typeof (Origen) == "function") {
                // no clona funciones
            }
            if (typeof (Origen) == "number") {
                return (Blanquear ? 0 : Origen);
            }
            if (typeof (Origen) == "string") {
                return (Blanquear ? "" : Origen);
            }
            if (typeof (Origen) == "object") {
                if (Origen instanceof Array) {
                    var NuevoArray = new Array();
                    if (!Blanquear) {
                        for (var n = 0; n < Origen.length; n += 1) {
                            NuevoArray.push(this.Clonar(Origen[n], Blanquear));
                        }
                    }
                    return NuevoArray;
                }
                else if (Origen instanceof Date) {
                    return (Blanquear ? new Date(0, 0, 0) : new Date(Origen));
                }
                else if (Origen instanceof Number) {
                    return (Blanquear ? new Number() : new Number(Origen));
                }
                else if (Origen instanceof Boolean) {
                    return (Blanquear ? new Boolean() : new Boolean(Origen));
                }
                else {
                    var NuevoObjeto = {}
                    for (var Prop in Origen) {
                        NuevoObjeto[Prop] = this.Clonar(Origen[Prop], Blanquear);
                    }
                    return NuevoObjeto
                }
            }
        } else {
            return null;
        }
    }
}

MoniMisi2.Funciones.registerClass('MoniMisi2.Funciones', Sys.Component);
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();
